package com.clouduserservice8001.mapper;

import com.clouduserservice8001.entity.Employee;
import com.clouduserservice8001.dto.EmployeeVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.common.BaseMapper;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 员工数据访问接口
 */
@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
    
    /**
     * 根据用户ID查询员工
     * @param userId 用户ID
     * @return 员工信息
     */
    Employee selectByUserId(@Param("userId") String userId);
    
    /**
     * 根据员工工号查询员工
     * @param employeeNo 员工工号
     * @return 员工信息
     */
    Employee selectByEmployeeNo(@Param("employeeNo") String employeeNo);
    
    /**
     * 根据部门查询员工列表
     * @param deptName 部门名称
     * @return 员工列表
     */
    List<Employee> selectByDeptName(@Param("deptName") String deptName);
    
    /**
     * 根据状态查询员工列表
     * @param status 状态
     * @return 员工列表
     */
    List<Employee> selectByStatus(@Param("status") String status);
    
    /**
     * 更新员工状态
     * @param userId 用户ID
     * @param status 状态
     * @param updateBy 更新人
     * @param updateTime 更新时间
     * @return 影响行数
     */
    int updateStatus(@Param("userId") String userId, @Param("status") String status,
                    @Param("updateBy") String updateBy, @Param("updateTime") LocalDateTime updateTime);

    /**
     * 选择性更新员工信息
     * @param employee 员工信息
     * @return 影响行数
     */
    int updateEmployeeSelective(Employee employee);

    /**
     * 检查员工工号是否存在
     * @param employeeNo 员工工号
     * @return 存在数量
     */
    int countByEmployeeNo(@Param("employeeNo") String employeeNo);
    
    /**
     * 分页查询员工列表
     * @param deptName 部门名称（可选）
     * @param status 状态（可选）
     * @param keyword 关键字（可选，搜索员工工号或姓名）
     * @return 员工列表
     */
    List<Employee> selectEmployeeList(@Param("deptName") String deptName,
                                     @Param("status") String status,
                                     @Param("keyword") String keyword);
    
    /**
     * 根据上级ID查询下属员工列表
     * @param managerId 上级用户ID
     * @return 员工列表
     */
    List<Employee> selectByManagerId(@Param("managerId") String managerId);

    // ===== 以下是关联查询方法，返回EmployeeVO =====

    /**
     * 根据用户ID查询员工详细信息（关联用户表）
     * @param userId 用户ID
     * @return 员工详细信息
     */
    EmployeeVO selectEmployeeVOByUserId(@Param("userId") String userId);

    /**
     * 根据员工工号查询员工详细信息（关联用户表）
     * @param employeeNo 员工工号
     * @return 员工详细信息
     */
    EmployeeVO selectEmployeeVOByEmployeeNo(@Param("employeeNo") String employeeNo);

    /**
     * 查询员工详细信息列表（关联用户表）
     * @param deptName 部门名称（可选）
     * @param status 状态（可选）
     * @param keyword 关键字（可选，搜索员工工号或姓名）
     * @return 员工详细信息列表
     */
    List<EmployeeVO> selectEmployeeVOList(@Param("deptName") String deptName,
                                         @Param("status") String status,
                                         @Param("keyword") String keyword);

    /**
     * 根据部门查询员工详细信息列表（关联用户表）
     * @param deptName 部门名称
     * @return 员工详细信息列表
     */
    List<EmployeeVO> selectEmployeeVOByDept(@Param("deptName") String deptName);

    /**
     * 根据上级ID查询下属员工详细信息列表（关联用户表）
     * @param managerId 上级用户ID
     * @return 员工详细信息列表
     */
    List<EmployeeVO> selectEmployeeVOByManager(@Param("managerId") String managerId);
}
